home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / utility / 647 / pcraw2st / pcraw2st.c next >
C/C++ Source or Header  |  1992-10-25  |  10KB  |  293 lines

  1. /**
  2.     : pcraw2st.c
  3.     : Chris Herborth, Sept.8/92
  4.  
  5.     : compile with -DDEBUG to enable DEBUGging output
  6.     : compile with -DUSE_FPRINTF to use fprintf() instead of fputc()
  7.       (I dunno why you'd want to do that, but you can...)
  8.     : compile with -DINTEL on an Intel-based machine (ie, DOS or any
  9.       other 80x86 computer)
  10.     
  11.     : This is to convert PC RAW files, produced by ray tracers such as QRT,
  12.       DKB, and POV-Ray, into ST format RAW files.  I'm not sure why the guy
  13.       who ported QRT to the ST decided to munge their format, but...
  14.  
  15.     : Usage: pcraw2st infile.raw outfile.raw
  16.  
  17.     : Version History
  18.       0.0 - First version, didn't work.
  19.       0.1 - Worked... kinda.
  20.       0.2 - Fixed for Intel/Motorola byte-order difference.  Much better!
  21.       0.3 - Made the bytes "unsigned char" instead of "char"...
  22.             Made the error codes positive instead of negative (thus
  23.                 preventing some apps/shells from hurling).
  24.             Added a bit of sanity checking to the image size.
  25.             Added a bit of DEBUGging output.
  26.             Fixed a really dumb error (I used a variable as an array
  27.                 index without initializing it... duh).
  28.       0.4 - v 0.3 wouldn't convert 320x200 files (whoops!)
  29.             Added much more DEBUGgin output.
  30.             Used fputc() instead of fprintf().
  31.             Added #include <stdlib.h> for MiNT.
  32.             Used calloc() instead of malloc().
  33.             Added #ifdef's so you can compile easier (?) on an Intel-based
  34.                 CPU.
  35. **/
  36.  
  37. /** : Header files...                                                       **/
  38. #include <stdio.h>
  39. #include <string.h>
  40. #ifdef SOZOBON
  41. #ifndef __MINT__
  42. #include <malloc.h>
  43. #else  /* __MINT__ */
  44. #include <stdlib.h>
  45. #endif /* __MINT__ */
  46. #endif /* SOZOBON  */
  47.  
  48. /** : Define error messages...                                              **/
  49. #define OK           0      /* No errors.               */
  50. #define USAGE_ERR    1      /* Dumb user error.         */
  51. #define FILE_SAME    2      /* infile == outfile error  */
  52. #define NO_MEMORY    3      /* Insufficient memory      */
  53. #define WEIRDSIZE    4      /* Absurd image size        */
  54.  
  55. int        main( argc, argv )
  56. unsigned   argc;
  57. char     **argv;
  58. {
  59.     FILE *infile,           /* Input file handle.  */
  60.          *outfile;          /* Output file handle. */
  61.     
  62.     char *r_line,           /* RGB lines from the PC RAW file */
  63.          *g_line,           /* malloc() these                 */
  64.          *b_line,
  65.          *in_name,          /* Filename pointers    */
  66.          *out_name;
  67.  
  68.     unsigned char thing;    /* One input byte       */
  69.     
  70.     int   width,            /* Image width              */
  71.           height,           /* Image height             */
  72.           line,             /* Line loop                */
  73.           loop,             /* Pixel loop               */
  74.           err_mess,         /* Error number             */
  75.           ret;              /* Function return value.   */
  76.  
  77.     union
  78.     {
  79.         int  w;
  80.         unsigned char b[1];
  81.     } spam;
  82.  
  83. #ifdef DEBUG
  84. printf( "DEBUG (%d): Initializing variables\n", __LINE__ );
  85. #endif
  86.     /* Initialize our variables...                                            */
  87.     infile  = NULL;         /* File pointers don't point yet... */
  88.     outfile = NULL;
  89.  
  90.     r_line = NULL;          /* Neither do our line pointers...  */
  91.     g_line = NULL;
  92.     b_line = NULL;
  93.  
  94.     loop = 1;               /* Start with the first argument... */
  95.     
  96.     err_mess = OK;          /* We haven't had any errors yet... */
  97.  
  98. #ifdef DEBUG
  99. printf( "DEBUG (%d): Parsing command line (argc = %d)\n", __LINE__, argc );
  100. #endif
  101.     /* Parse the command line...  This is mostly here for future expansion... */
  102.     if( argc < 2 )
  103.         err_mess = USAGE_ERR;
  104.     else
  105.     {
  106.         if( argv[loop][0] == '-' )
  107.             switch( argv[loop][1] )
  108.             {
  109.                 case '?':
  110.                 case 'h':
  111.                 case 'H':
  112.                     err_mess = USAGE_ERR;
  113.                     break;
  114.  
  115.         case 'V':
  116.             puts( "pcraw2st 0.4" );
  117.             err_mess = 13;
  118.             break;
  119.  
  120.                 default:
  121.                     err_mess = USAGE_ERR;
  122.                     break;
  123.             }
  124.         else
  125.         {
  126.             in_name  = argv[1];
  127.             out_name = argv[2];
  128.             ret = strcmp( in_name, out_name );
  129.             if( ret == 0 )
  130.                 err_mess = FILE_SAME;
  131.         }
  132.     }  
  133.  
  134.  
  135.     /* If we haven't had any problems, try to process the files... */
  136.     if( err_mess == OK )
  137.     {
  138. #ifdef DEBUG
  139. printf( "DEBUG (%d): Attempting to open input file \"%s\".\n", __LINE__, in_name );
  140. #endif
  141.         infile  = fopen( in_name, "rb" );
  142.         if( infile == NULL )
  143.         {
  144.             printf( "Unable to open %s...\n", infile );
  145.             exit( -1 );
  146.         }
  147.         
  148. #ifdef DEBUG
  149. printf( "DEBUG (%d): Attempting to open output file \"%s\".\n", __LINE__, out_name );
  150. #endif
  151.         outfile = fopen( out_name, "wb" );
  152.         if( outfile == NULL )
  153.         {
  154.             printf( "Unable to create %s...\n", outfile );
  155.             exit( -1 );
  156.         }
  157.         
  158. #ifdef DEBUG
  159. printf( "DEBUG (%d): Getting image width and height.\n", __LINE__ );
  160. #endif
  161.         /* Get our image width... */
  162.     /* These have to be swapped around for Intel Idiotic format. */        
  163. #ifndef INTEL
  164.         spam.b[1] = fgetc( infile ); /* Motorola-based machines use this. */
  165.         spam.b[0] = fgetc( infile );
  166. #else
  167.         spam.b[0] = fgetc( infile ); /* Intel-based use this. */
  168.         spam.b[1] = fgetc( infile );
  169. #endif
  170.         width = spam.w;
  171.        
  172.         /* Get our image height... */
  173.     /* These have to be swapped around for Intel Idiotic format. */        
  174. #ifndef INTEL
  175.         spam.b[1] = fgetc( infile ); /* Motorola-based machines use this. */
  176.         spam.b[0] = fgetc( infile );
  177. #else
  178.         spam.b[0] = fgetc( infile ); /* Intel-based use this. */
  179.         spam.b[1] = fgetc( infile );
  180. #endif
  181.         height = spam.w;
  182.  
  183.         if( width < 1 || height < 1 )
  184.             err_mess = WEIRDSIZE;
  185.         
  186.         if( err_mess == OK )
  187.         {
  188.             /* Talk to the user... */
  189.             printf( "Converting %d x %d image:\n", width, height );
  190.  
  191.             /* Put the width/height into the new file... */
  192.             fprintf( outfile, "%d %d%c", width, height, 0x0a );
  193.             fflush( outfile );
  194.  
  195. #ifdef DEBUG
  196. printf( "DEBUG (%d): Allocating line buffers.\n", __LINE__ );
  197. #endif
  198.             r_line = calloc( 1, width );
  199.             g_line = calloc( 1, width );
  200.             b_line = calloc( 1, width );
  201.             if( r_line == NULL || g_line == NULL || b_line == NULL )
  202.             {
  203. #ifdef DEBUG
  204. printf( "DEBUG (%d): Unable to allocate line buffers.\n", __LINE__ );
  205. #endif
  206.                 err_mess = NO_MEMORY;
  207.             }
  208.  
  209.             if( err_mess == OK )
  210.             {
  211.                 for( line = 0; line < height; line++ )
  212.                 {
  213.                 /* Get the current line number. We don't do anything with it. */
  214.                     /* These have to be swapped around for Intel Idiotic format. */
  215. #ifdef DEBUG
  216. printf( "DEBUG (%d): Getting line %d.\n", __LINE__, line );
  217. #endif
  218.                     spam.b[1] = fgetc( infile );
  219.                     spam.b[0] = fgetc( infile ); /* Ignore the line number */
  220.                     fread( r_line, width, 1, infile );
  221.                     fread( g_line, width, 1, infile );
  222.                     fread( b_line, width, 1, infile );
  223.                 
  224. #ifdef DEBUG
  225. printf( "DEBUG (%d): Writing line %d.\n", __LINE__, line );
  226. #endif
  227.                     for( loop = 0; loop < width; loop++ )
  228.                     {
  229. #ifndef USE_FPRINTF
  230.                         fputc( r_line[loop], outfile );
  231.                         fputc( g_line[loop], outfile );
  232.                         fputc( b_line[loop], outfile );
  233. #else
  234.                         fprintf( outfile, "%c%c%c", r_line[loop], g_line[loop],
  235.                                  b_line[loop] );
  236. #endif
  237.                     }
  238.                 
  239.                     fflush( outfile );
  240.                     printf( "." );
  241.                     if( ( line + 1 ) % 50 == 0 )
  242.                         printf( "%d", line + 1 );
  243.             fflush( stdout );
  244.                 }
  245.             }
  246.         }
  247.     }    
  248.                     
  249.     switch( err_mess )
  250.     {
  251.         case OK:
  252.             puts( " done." );
  253.             break;
  254.             
  255.         case USAGE_ERR:
  256.             puts( "Usage:  pcraw2st infile.raw outfile.raw" );
  257.             break;
  258.  
  259.         case FILE_SAME:
  260.             printf( "Cannot convert %s to %s!\n", in_name, out_name );
  261.             puts( "File names must be different!" );
  262.             break;
  263.  
  264.         case NO_MEMORY:
  265.             puts( "Insufficient memory!" );
  266.             break;
  267.  
  268.         case WEIRDSIZE:
  269.             printf( "Absurd image size! (%d x %d)\n", width, height );
  270.             break;
  271.  
  272.         default:
  273.             break;
  274.     }
  275.  
  276.     /* Close our files... */
  277.     if( infile != NULL )
  278.         fclose( infile );
  279.     if( outfile != NULL )
  280.         fclose( outfile );
  281.         
  282.     /* Toss our memory... */
  283.     if( r_line != NULL )
  284.         free( r_line );
  285.     if( g_line != NULL )
  286.         free( g_line );
  287.     if( b_line != NULL )
  288.         free( b_line );
  289.  
  290.     /* Beat it... */                
  291.     exit( err_mess );
  292. }
  293.